home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / sync / sun4.md / Sync_Unlock.s < prev   
Text File  |  1989-02-24  |  3KB  |  92 lines

  1. /*
  2.  * syncAsm.s --
  3.  *
  4.  *    Source code for the Sync_Unlock library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16.     .seg    "data"
  17.     .asciz "$Header: /sprite/src/lib/c/sync/sun4.md/RCS/Sync_Unlock.s,v 1.1 89/02/24 17:03:13 mgbaker Exp Locker: mgbaker $ SPRITE (Berkeley)"
  18.     .align    8
  19.     .seg    "text"
  20.  
  21. /*
  22.  *----------------------------------------------------------------------------
  23.  *
  24.  * Sync_Unlock --
  25.  *
  26.  *      Release a lock.  This is called at the end of a critical
  27.  *      section of code to allow other processes to execute within the
  28.  *      critical section.  If any processes are waiting to acquire this
  29.  *      lock they are made runnable.  They will try to gain the lock
  30.  *      again the next time they run.
  31.  *
  32.  * Results:
  33.  *    None.
  34.  *
  35.  * Side effects:
  36.  *    The lock is cleared.  Processes waiting on the lock are made runnable.
  37.  *
  38.  * C equivalent:
  39.  *
  40.  *    void
  41.  *    Sync_Unlock(lockPtr)
  42.  *        Sync_Lock *lockPtr;
  43.  *    {
  44.  *        lockPtr->inUse = 0;
  45.  *        if (lockPtr->waiting) {
  46.  *        Sync_SlowBroadcast((int)lockPtr, &lockPtr->waiting);
  47.  *        }
  48.  *    }
  49.  *
  50.  *----------------------------------------------------------------------------
  51.  */
  52.  
  53. .seg    "text"
  54. .globl _Sync_Unlock
  55. _Sync_Unlock:
  56.  
  57.     /* prologue */
  58.     set        (-104), %g1
  59.     save    %sp, %g1, %sp
  60.     /* end prologue */
  61.  
  62.     st        %g0, [%i0]    /* lockPtr->inUse = 0; */
  63.  
  64.     /*
  65.      * The check on the waiting bit races with the assignment
  66.      * statement that clears it in Sync_SlowBroadcast. In the
  67.      * worst case we assume someone is waiting that is really
  68.      * just waking up because we've cleared the inUse bit.
  69.      * That results in a wasted call to Sync_SlowBroadcast.
  70.      */
  71.  
  72.     ld        [%i0 + 4], %g1        /* get lockPtr->waiting */
  73.     tst        %g1            /* if (lockPtr->waiting) { */
  74.     be        BailOut            /*  Bail out if !lockPtr->waiting */
  75.  
  76.     /*
  77.      * Note the broadcast semantics for Sync_SlowBroadcast.
  78.      * All processes waiting on the lock will be made runnable,
  79.      * however, all but one will sleep again inside Sync_SlowLock.
  80.      */
  81.     nop
  82.     mov        %i0, %g1    /* get address of lockPtr->waiting */
  83.     add        %g1, 4, %g1
  84.     mov        %i0, %o0    /* first arg is lockPtr */
  85.     mov        %g1, %o1    /* next arg is &lockPtr->waiting */
  86.     call    _Sync_SlowBroadcast,2
  87.     nop
  88.  
  89. BailOut:
  90.     ret
  91.     restore
  92.